home *** CD-ROM | disk | FTP | other *** search
/ PC World Interactive 7 / PC World Interactive 7.iso / program / ctutor.exe / TEXT / CHAP07.TXT < prev    next >
Text File  |  1994-05-15  |  20KB  |  406 lines

  1.  
  2.  
  3.  
  4.                                                         Chapter 7
  5.                                                STRINGS AND ARRAYS
  6.  
  7. WHAT IS A STRING?
  8. -----------------------------------------------------------------
  9. A string is a group of characters, usually letters of the 
  10. alphabet.  In order to format your printout in such a way that it 
  11. looks nice, has meaningful names and titles, and is aesthetically 
  12. pleasing to you and the people using the output of your program, 
  13. you need the ability to output text data.  Actually you have 
  14. already been using strings, because the second program in this 
  15. tutorial, way back in Chapter 2, output a message that was 
  16. handled internally as a string.  A complete definition of a 
  17. string is a series of char type data terminated by a NULL 
  18. character. 
  19.  
  20. When C is going to use a string of data in some way, either to 
  21. compare it with another string, output it, copy it to another 
  22. string, or whatever, the functions are set up to do what they are 
  23. called to do until a NULL, which is a zero, is detected.  Such a 
  24. string is often called an ASCII-Z string.  We will use a few 
  25. ASCII-Z strings in this chapter.
  26.  
  27.  
  28. WHAT IS AN ARRAY?
  29. -----------------------------------------------------------------
  30. An array is a series of homogeneous pieces of data that are all 
  31. identical in type, but the type can be quite complex as we will 
  32. see when we get to the chapter of this tutorial discussing 
  33. structures.  A string is simply a special case of an array, a 
  34. series of char type data. 
  35.  
  36. The best way to see these principles is by use  =================
  37. of an example, so load the program CHRSTRG.C        CHRSTRG.C
  38. and display it on your monitor.  The first      =================
  39. thing new is in line 6 which defines a char 
  40. type of data entity.  The square brackets define an array 
  41. subscript in C, and in the case of the data definition statement, 
  42. the 5 in the brackets defines 5 data fields of type char all 
  43. defined as part of the variable.  In the C language, all 
  44. subscripts start at 0 and increase by 1 each step up to the 
  45. maximum which in this case is 4.  We therefore have 5 char type 
  46. variables named, name[0], name[1], name[2], name[3], and name[4].  
  47. You must keep in mind that in C, the subscripts actually go from 
  48. 0 to one less than the number defined in the definition 
  49. statement.  This is due to the original definition of C and 
  50. these limits cannot be changed or redefined by the programmer.
  51.  
  52.  
  53.  
  54.  
  55.  
  56.  
  57.                                                          Page 7-1
  58.  
  59.                                    Chapter 7 - Strings and Arrays
  60.  
  61. HOW DO WE USE THE STRING?
  62. -----------------------------------------------------------------
  63. The variable name is therefore a string which can hold up to 5 
  64. characters, but since we need room for the NULL terminating 
  65. character which counts as one of the five characters, there are 
  66. actually only four usable characters.  To load something useful 
  67. into the string, we have 5 assignment statements, each of which 
  68. assigns one alphabetical character to one of the string 
  69. characters.  Finally, the last place in the string is filled with 
  70. the numeral 0 as the end indicator and the string is complete.  
  71. (A define would allow us to use NULL instead of a zero, and this 
  72. would add greatly to the clarity of the program. It would be very 
  73. obvious that this was a NULL and not simply a zero for some other 
  74. purpose.)  Now that we have the string, we will print it out with 
  75. some other string data in the output statement, line 14.
  76.  
  77. The %s in the format portion of the printf() statement is the 
  78. output definition used to output a string.  The system will 
  79. output characters starting with the first one in the string name 
  80. until it comes to the NULL character, where it will quit.  Notice 
  81. that in the printf() statement, only the variable name which 
  82. happens to be name needs to be given, with no subscript since we 
  83. are interested in starting at the beginning.  (There is actually 
  84. another reason that only the variable name is given without 
  85. brackets.  The discussion of that topic will be given in the next 
  86. chapter.)  It is important to realize that name by itself refers 
  87. to the entire string, but name[] with some value in the square 
  88. braces refers to only a single character in the string.
  89.  
  90.  
  91. OUTPUTTING PART OF A STRING
  92. -----------------------------------------------------------------
  93. The printf() in line 15 illustrates that we can output any single 
  94. character of the string by using the %c and naming the particular 
  95. character of the variable name we want by including the subscript.  
  96. Notice that the term with the square brackets refers to only a 
  97. single character in the string, so we output it with the %c 
  98. notation which is used to format and output a single character.  
  99. The last printf() illustrates how we can output part of the 
  100. string by stating the starting point by using a subscript.  The & 
  101. specifies the address of name[1].  We will study this in the next 
  102. chapter but I thought you would benefit from a little glimpse 
  103. ahead, so don't worry about this construct yet.  You will notice, 
  104. however, that we can print only part of the string by starting 
  105. later in the string and printing until we reach the terminating 
  106. null.
  107.  
  108. This example may make you feel that strings are rather cumbersome 
  109. to use since you have to set up each character one at a time.  
  110. Strings would be very difficult to use if they had to be defined 
  111. like we defined the string in this program, but we only did this 
  112. so you could see the internal structure of the string.  The next 
  113.  
  114.  
  115.                                                          Page 7-2
  116.  
  117.                                    Chapter 7 - Strings and Arrays
  118.  
  119. example program will illustrate that strings are very easy to 
  120. use.  Be sure to compile and run this program.
  121.  
  122.  
  123. SOME STRING FUNCTIONS
  124. -----------------------------------------------------------------
  125. Load the example program STRINGS.C for an       =================
  126. example of some ways to use strings.  First we      STRINGS.C
  127. define four strings in lines 7 and 8.  Next we  =================
  128. come to a new function that you will find very 
  129. useful, the strcpy() function, or string copy.  It copies from 
  130. one string to another until it comes to the NULL character in the 
  131. source string.  Remember that the NULL is actually a zero and is 
  132. added to the character string by the system.  It is easy to 
  133. remember which one gets copied to which if you think of them like 
  134. an assignment statement.  Thus if you were to say, for example, 
  135. x = 23;, the data is copied from the right entity to the left 
  136. one.  In the strcpy() function, the data is also copied from the 
  137. right entity to the left, so that after execution of the first 
  138. statement, the string variable name1 will contain the string 
  139. "Rosalinda", but without the double quotes, they are the 
  140. compiler's way of knowing that you are defining a string.  The 
  141. term "Rosalinda" is actually a string constant in exactly the 
  142. same way that 23 is an integer constant as used in the expression 
  143. index = 23.  Line 10 is copying a string constant into a string 
  144. variable.
  145.  
  146. Likewise, the string "Zeke" is copied into name2 in line 11, then 
  147. the title string is copied into the string named title.  The 
  148. title and both names are then printed out.  Note that it is not 
  149. necessary for the destination string to be exactly the same size 
  150. as the string it will be called upon to store, only that it is at 
  151. least as long as the source string plus one more character for 
  152. the terminating NULL. 
  153.  
  154.  
  155. ALPHABETICAL SORTING OF STRINGS
  156. -----------------------------------------------------------------
  157. The next function we will look at is the strcmp() or the string 
  158. compare function illustrated in line 18.  It will return a 1 if 
  159. the first string is larger than the second, zero if they are the 
  160. same length and have the same characters, and -1 if the first 
  161. string is smaller than the second.  One of the strings, depending 
  162. on the result of the compare is copied into the string variable 
  163. mixed, and the largest name alphabetically is printed out.  It 
  164. should come as no surprise to you that Zeke wins because it is 
  165. alphabetically larger, length doesn't matter, only relative 
  166. position in the alphabet.  It might be wise to mention that the 
  167. result would also depend on whether the letters were upper or 
  168. lower case.  There are also functions available with your C 
  169. compiler to change the case of a string to all upper or all 
  170. lower case if you desire.  These will be used in an example 
  171. program later in this tutorial.
  172.  
  173.                                                          Page 7-3
  174.  
  175.                                    Chapter 7 - Strings and Arrays
  176.  
  177. COMBINING STRINGS
  178. -----------------------------------------------------------------
  179. Lines 25 through 28 illustrate another new feature, the strcat(), 
  180. or string concatenation function.  This function simply adds the 
  181. characters from one string onto the end of another string taking 
  182. care to adjust the NULL so everything is still all right.  In 
  183. this case, name1 is copied into mixed, then two blanks are 
  184. concatenated to mixed, and finally name2 is concatenated to the 
  185. combination.  The result is printed out with both names in the 
  186. one string variable mixed.
  187.  
  188. Strings are not difficult to use and are extremely useful, but 
  189. they so require some care in their use.  It is possible to copy a 
  190. long string into a string that has been defined as shorter, but 
  191. this is an error and will overwrite some portion of your program.  
  192. There is no way for the compiler to warn you of this.
  193.  
  194. A quick check of the documentation for one compiler revealed 
  195. about 24 string functions available for use.  Some are used for 
  196. copying strings with upper limits on how many characters can be 
  197. copied.  There are string functions to search for certain 
  198. characters in a string, and others for adding characters to the 
  199. front, middle, or end of a string.  And of course you can remove 
  200. characters from anywhere also.  It would pay you to read your 
  201. compiler documentation to see just what string functions are 
  202. available for your use.  It could greatly simplify something you 
  203. will be doing in the near future if you know what is available.  
  204. You should spend some time getting familiar with strings before 
  205. proceeding on to the next topic.  We included the file named 
  206. string.h in line 3 because it contains prototypes for all of the 
  207. string functions.  A little time spent examining this file would 
  208. be time well spent.
  209.  
  210. Compile and run this program and observe the results for 
  211. compliance with this definition.
  212.  
  213.  
  214. AN ARRAY OF INTEGERS
  215. -----------------------------------------------------------------
  216. Load the file INTARRAY.C and display it on your  ================
  217. monitor for an example of an array of integers.     INTARRAY.C
  218. Notice that the array is defined in much the     ================
  219. same way we defined an array of char in order 
  220. to do the string manipulations in the last example program.  We 
  221. have 12 integer variables to work with, plus one more named 
  222. index.  The names of the variables are values[0], values[1], ... 
  223. , and values[11].  In lines 9 and 10 we have a loop to assign 
  224. nonsense, but well defined, data to each of the 12 variables, 
  225. then print all 12 out in lines 12 and 13.  Note carefully that 
  226. each element of the array is simply an int type variable capable 
  227. of storing an integer value.  The only difference between the 
  228. variables index and values[2], for example, is in the way you 
  229. address them.  You should have no trouble following this program, 
  230.  
  231.                                                          Page 7-4
  232.  
  233.                                    Chapter 7 - Strings and Arrays
  234.  
  235. but be sure you understand it.  Compile and run it to see if it 
  236. does what you expect it to do.
  237.  
  238.  
  239. AN ARRAY OF FLOATING POINT DATA
  240. -----------------------------------------------------------------
  241. Load and display the program named BIGARRAY.C    ================
  242. for an example of a program with an array of        BIGARRAY.C
  243. float type data.  This program has an extra      ================
  244. feature to illustrate how strings can be 
  245. initialized.  Line 4 of the program illustrates how to initialize 
  246. a string of characters.  Notice that the square brackets are 
  247. empty leaving it up to the compiler to count the characters and 
  248. allocate enough space for our string plus the terminating NULL.  
  249. Another string is initialized in line 11 of the body of the 
  250. program but it must be declared static here. This prevents it 
  251. from being allocated as an automatic variable and allows it to 
  252. retain the string once the program is started.  There is nothing 
  253. else new here, the variables are assigned nonsense data and the 
  254. results of all the nonsense are printed out along with a header.  
  255. This program should also be easy for you to follow, so study it 
  256. until you are sure of what it is doing before going on to the 
  257. next topic.  Once again, the float array can corrupt a program if 
  258. it is used to write past the end of the array.
  259.  
  260.  
  261. GETTING DATA BACK FROM A FUNCTION
  262. -----------------------------------------------------------------
  263. Back in chapter 5 when we studied functions, I   ================
  264. hinted to you that there was a way to get data      PASSBACK.C
  265. back from a function by using an array, and      ================
  266. that is true.  Examine the program PASSBACK.C 
  267. for an example of doing that.  In this program, we define an 
  268. array of 20 variables named matrix in line 8, then assign some 
  269. nonsense data to the variables, and print out the first five.  In 
  270. line 16 we call the function dosome() taking along the entire 
  271. array by putting the name of the array in the parentheses.
  272.  
  273. The function dosome() beginning in line 22 has a name in its 
  274. parentheses also but it prefers to call the array list 
  275. internally.  The function needs to be told that it is really 
  276. getting an array passed to it and that the array is of type int.  
  277. Line 22 does that by defining list as an integer type variable 
  278. and including the square brackets to indicate an array.  It is 
  279. not necessary to tell the function how many elements are in the 
  280. array.  Generally a function works with an array until some 
  281. end-of-data marker is found, such as a NULL for a string, or 
  282. some other previously defined data or pattern.  Many times, 
  283. another piece of data is passed to the function with a count of 
  284. how many elements to work with.  In our present illustration, 
  285. we will use a fixed number of elements to keep it simple.
  286.  
  287.  
  288.  
  289.                                                          Page 7-5
  290.  
  291.                                    Chapter 7 - Strings and Arrays
  292.  
  293. So far nothing is different from the previous functions we have 
  294. called except that we have passed more data points to the 
  295. function this time than we ever have before, having passed 20 
  296. integer values, the entire array.  We print out the first 5 
  297. again in lines 26 and 27 to see if they did indeed get passed 
  298. here.  In lines 29 and 30 we add ten to each of the elements and 
  299. print out the new values.  Finally we return to the main program 
  300. and print out the same 5 data points.  We find that we have 
  301. indeed modified the data stored in the calling program from 
  302. within the function, and when we returned to the main program, 
  303. we brought the changes back.  Compile and run this program to 
  304. verify this conclusion.
  305.  
  306.  
  307. ARRAYS PASS DATA BOTH WAYS
  308. -----------------------------------------------------------------
  309. We stated during our study of functions that when we passed data 
  310. to a function, the system made a copy to use in the function 
  311. which was thrown away when we returned.  This is not the case 
  312. with arrays.  The actual array is passed to the function and the 
  313. function can modify it any way it wishes to.  The result of the 
  314. modifications will be available back in the calling program.  
  315. This may seem strange to you that arrays are handled differently 
  316. from single point data, but they are.  It really does make sense, 
  317. but you will have to wait until we get to pointers to understand 
  318. it. 
  319.  
  320.  
  321. A HINT AT A FUTURE LESSON
  322. -----------------------------------------------------------------
  323. Another way of getting data back from a function to the calling 
  324. program is by using a pointer which we will discuss in the next 
  325. chapter.  When we get there we will find that an array is in 
  326. reality a pointer to a list of values.  Don't let that worry you 
  327. now, it will make sense when we get there.  In the meantime, 
  328. concentrate on arrays and understand the basics of them because 
  329. when we get to the study of structures we will be able to define 
  330. some pretty elaborate arrays.
  331.  
  332.  
  333. MULTI-DIMENSIONAL ARRAYS
  334. -----------------------------------------------------------------
  335. Load and display the file named MULTIARY.C for   ================
  336. an example of a program with doubly dimensioned     MULTIARY.C
  337. arrays.  The variable big is an 8 by 8 array     ================
  338. that contains 8 times 8 or 64 elements total.  
  339. The first element is big[0][0], and the last is big[7][7].  
  340. Another array named large is also defined which is not square to 
  341. illustrate that the array need not be square.  Both are filled 
  342. with data, one representing a multiplication table, and the other 
  343. being formed into an addition table.
  344.  
  345.  
  346.  
  347.                                                          Page 7-6
  348.  
  349.                                    Chapter 7 - Strings and Arrays
  350.  
  351. To illustrate that individual elements can be modified at will, 
  352. one of the elements of big is assigned the value from one of the 
  353. elements of large after being multiplied by 22 in line 17.  Next 
  354. big[2][2] is assigned the arbitrary value of 5, and this value is 
  355. used for the subscripts of the assignment statement in line 19.  
  356. The assignment statement in line 19 is in reality big[5][5] = 177; 
  357. because each of the subscripts contain the value 5.  This is only 
  358. done to illustrate that any valid expression can be used for a 
  359. subscript.  It must only meet two conditions, it must be an 
  360. integer (although a char will work just as well), and it must be 
  361. within the range of the subscript it is being used for.
  362.  
  363. The entire matrix variable big is printed out in a square form in 
  364. lines 21 through 25 so you can check the values to see if they 
  365. did get set the way you expected them to.
  366.  
  367.  
  368. PROGRAMMING EXERCISES
  369. -----------------------------------------------------------------
  370. 1.  Write a program with three short strings, about 6 characters 
  371.     each, and use strcpy() to copy the string literals "one", 
  372.     "two", and "three" into them. Concatenate the three strings 
  373.     into one larger string defined with 30 characters and print 
  374.     the result out 10 times.
  375.  
  376. 2.  Define two integer arrays, each 10 elements long, called 
  377.     array1 and array2. Using a loop, put some kind of nonsense 
  378.     data in each and add them term for term into another 10 
  379.     element array named arrays.  Finally, print all results in a 
  380.     table with an index number.
  381.  
  382.     1       2 + 10 = 12
  383.     2       4 + 20 = 24
  384.     3       6 + 30 = 36   etc.
  385.  
  386.     Hint; The print statement will be similar to;
  387.     printf("%4d %4d + %4d = %4d\n", index,
  388.                  array1[index], array2[index], arrays[index]);
  389.  
  390. 3.  Define a string of some selected length, assign a word or 
  391.     phrase to it, and print it out as a string, then print it out 
  392.     as individual characters.  Finally, print it out backwards by 
  393.     using a for loop with a decrementing third term.  A useful 
  394.     function for the first term of the for loop is strlen() which 
  395.     returns the length of the string by counting characters up 
  396.     to, but not including, the terminating null.
  397.  
  398.  
  399.  
  400.  
  401.  
  402.  
  403.  
  404.  
  405.                                                          Page 7-7
  406.